import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.Objects;
import java.util.Random;

import static javax.swing.WindowConstants.HIDE_ON_CLOSE;

public class GameFrame extends JFrame implements KeyListener, ActionListener {
    //创建一个二维数组
    int[][] data = new int[4][4];
    int[][] win = {
            {1, 2, 3, 4},
            {5, 6, 7, 8},
            {9, 10, 11, 12},
            {13, 14, 15, 0}
    };

    //记录空白方块的位置
    int x = 0;
    int y = 0;

    int step = 0;

    String path = "image/cute/";


    //菜单栏 栏目的详情
    JMenuItem repalyItem = new JMenuItem("重新游戏");
    JMenuItem reLoginItem = new JMenuItem("重新登陆");
    JMenuItem exitItem = new JMenuItem("退出游戏");
    JMenuItem aboutItem = new JMenuItem("作者微信");
    JMenuItem animal = new JMenuItem("动物世界");
    JMenuItem friend = new JMenuItem("绝对领域");

    JMenuItem girl = new JMenuItem("随机女友");
    JMenuItem sport = new JMenuItem("健康运动");

    public GameFrame() {
        //初始化界面
        initFrame();

        //初始化菜单
        initMenu();

        //初始化数据
        initData();

        //初始化图片
        initImage();

        this.setVisible(true);//界面显示出来,建议放最后  不可重复写，否则页面会重叠或覆盖
    }


    public boolean victory() {
        //判断现在的数组和胜利数组是否一致  返回值
        for (int i = 0; i < data.length; i++) {
            for (int j = 0; j < data.length; j++) {
                if (data[i][j] != win[i][j]) {
                    // 有一个数据不符合就输出false
                    return false;
                }
            }
        }

        return true;
    }

    private void initData() {
        int[] tempArr = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
        //为随机数类 创建对象
        Random r = new Random();
        for (int i = 0; i < tempArr.length; i++) {
            //获取随机索引
            int index = r.nextInt(tempArr.length);
            //拿着遍历的每一个数据，跟随机索引的数据进行交换
            int temp = tempArr[i]; //temp 临时变量用于交换
            tempArr[i] = tempArr[index];
            tempArr[index] = temp;

        }

        //给二维数组添加数据
        for (int i = 0; i < tempArr.length; i++) {
            //判断是否是0，记录位置
            if (tempArr[i] == 0) {
                x = i / 4;
                y = i % 4;
            }//添加数据到二维数组
            data[i / 4][i % 4] = tempArr[i];
        }
    }

    private void initImage() {
        // 清除原有的所有图片
        this.getContentPane().removeAll();
        //胜利输出图片
        if (victory()) {
            JLabel good = new JLabel(new ImageIcon("image/cute/win.png"));
            good.setBounds(200, 250, 197, 73);
            this.getContentPane().add(good);
            //刷新页面
            this.getContentPane().repaint();
        }

        //创建计步器
        JLabel steper = new JLabel("步数:" + step);
        steper.setBounds(50, 30, 50, 20);
        this.getContentPane().add(steper);


        //外循环 把内循环执行4次
        for (int i = 0; i < 4; i++) {
            //内循环 把图片每行4个排列
            for (int j = 0; j < 4; j++) {
                int number = data[i][j];
                //创建图像对象
                ImageIcon icon1 = new ImageIcon(path + number + ".jpg");
                //创建一个JLable的对象（管理容器）
                JLabel jLabel = new JLabel(icon1);
                //指定图片位置
                jLabel.setBounds(105 * j + 93, 105 * i + 108, 105, 105);

                //添加边框 （0突出 1陷入）
                jLabel.setBorder(new BevelBorder(0));


                //把管理容器添加界面中
                this.getContentPane().add(jLabel);
                //刷新页面
                this.getContentPane().repaint();


            }
        }
        //背景图片设置

        JLabel background = new JLabel(new ImageIcon("image/cute/background.png"));

        background.setBounds(48, 14, 508, 560);

        this.getContentPane().add(background);
        this.getContentPane().repaint();
    }

    private void initMenu() {
        //创建菜单栏
        JMenuBar jMenuBar = new JMenuBar();
        //菜单栏的栏目
        JMenu chooseMenu = new JMenu("更换图片");
        JMenu functionMenu = new JMenu("游戏设置");
        JMenu aboutMenu = new JMenu("关于我们");
        JMenu tips = new JMenu("笨蛋,按住L查看原图");


        //把详情加到栏目中去
        //二级菜单 两次Menu嵌套
        functionMenu.add(chooseMenu);
        functionMenu.add(repalyItem);
        functionMenu.add(reLoginItem);
        functionMenu.add(exitItem);

        aboutMenu.add(aboutItem);


        chooseMenu.add(animal);
        chooseMenu.add(friend);
        chooseMenu.add(girl);
        chooseMenu.add(sport);


        //栏目的详情 添加动作监听
        repalyItem.addActionListener(this);
        reLoginItem.addActionListener(this);
        exitItem.addActionListener(this);
        aboutItem.addActionListener(this);

        animal.addActionListener(this);
        friend.addActionListener(this);
        girl.addActionListener(this);
        sport.addActionListener(this);

        //把栏目加到菜单栏里

        jMenuBar.add(functionMenu);
        jMenuBar.add(aboutMenu);
        jMenuBar.add(tips);
        //给整个界面设置菜单
        this.setJMenuBar(jMenuBar);

        //显示菜单
        this.setLocationRelativeTo(null);
    }

    private void initFrame() {
        this.setTitle("拼图游戏 V1.0");
        this.setSize(608, 650);
        this.setAlwaysOnTop(true);//界面置顶
        this.setLocationRelativeTo(null);//居中
        this.setDefaultCloseOperation(3);//关闭模式设置
        this.setLayout(null);//取消默认居中放置，以xy轴放置
        this.addKeyListener(this);
    }


    @Override
    public void keyTyped(KeyEvent e) {

    }


    @Override  //松开时触发
    public void keyReleased(KeyEvent e) {
        //胜利就结束 准备重开
        if (victory()) {
            return;
        }
        int code = e.getKeyCode();
        if (code == 37) {
            // System.out.println("向左移动");
            //边界设置
            if (y == 3) {
                return;
            }
            //空白方块的右边数字移到左边
            data[x][y] = data[x][y + 1];
            data[x][y + 1] = 0;
            y++;
            //步数加1
            step++;
            //调用最新的数字加载图片
            initImage();

        } else if (code == 38) {
            // System.out.println("向上移动");
            //边界设置
            if (x == 3) {
                return;
            }
            //空白方块的下边数字移到上边
            data[x][y] = data[x + 1][y];
            data[x + 1][y] = 0;
            x++;
            //步数加1
            step++;
            //调用最新的数字加载图片
            initImage();

        } else if (code == 39) {
            // System.out.println("向右移动");
            //边界设置
            if (y == 0) {
                return;
            }
            //空白方块的左边数字移到右边
            data[x][y] = data[x][y - 1];
            data[x][y - 1] = 0;
            y--;
            //步数加1
            step++;
            //调用最新的数字加载图片
            initImage();

        } else if (code == 40) {
            // System.out.println("向下移动");
            //边界设置
            if (x == 0) {
                return;
            }
            //空白方块的上边数字移到下边
            data[x][y] = data[x - 1][y];
            data[x - 1][y] = 0;
            x--;
            //步数加1
            step++;
            //调用最新的数字加载图片
            initImage();


            //最后松开后把图片再重新打乱回去  加载图片
        } else if (code == 76) {
            initImage();


            //一键作弊码   O
        } else if (code == 79) {
            //赋值为正确数组
            data = new int[][]{
                    {1, 2, 3, 4},
                    {5, 6, 7, 8},
                    {9, 10, 11, 12},
                    {13, 14, 15, 0}
            };
            initImage();
        }
    }

    @Override//动作监听
    public void actionPerformed(ActionEvent e) {
        Object obj = e.getSource();
        if (obj == repalyItem) {
            System.out.println("重新游戏");

            step = 0;

            initData();

            initImage();

        } else if (obj == reLoginItem) {
            System.out.println("重新登陆");
            //关闭当前页面
            this.setVisible(false);
            //打开登陆界面
            new LoginFrame();

        } else if (obj == aboutItem) {
            System.out.println("关于我们");
            //新建一个弹窗对象
            JDialog jDialog = new JDialog();
            JLabel about = new JLabel(new ImageIcon("image/cute/aboutus.jpg"));
            about.setBounds(0, 0, 550, 550);
            jDialog.getContentPane().add(about);
            //给弹框设置大小
            jDialog.setSize(600, 600);
            //置顶
            jDialog.setAlwaysOnTop(true);
            //居中
            jDialog.setLocationRelativeTo(null);
            //设置不关闭无法操作其他窗口
            jDialog.setModal(true);
            //显示
            jDialog.setVisible(true);

        } else if (obj == exitItem) {
            System.out.println("退出游戏");

            System.exit(0);
        } else if (obj == girl) {
            System.out.println("随机选择女孩的图片");

            //数组里放文件夹的编号
            int[] g = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,14,15,16,17,18,19,20,21,22,23,24,25};
            Random r = new Random();

            //编号：获取随机索引（索引默认从0开始）
            int girlNumber = r.nextInt(g.length) + 1;
            System.out.println(girlNumber);
            path = "image/girl/girl" + girlNumber + "/";
            step = 0;
            initData();
            initImage();


        } else if (obj == animal) {
            System.out.println("随机选择动物的图片");
            //数组里放文件夹的编号
            int[] a = {1, 2, 3, 4, 5, 6, 7, 8};
            Random r = new Random();

            //编号：获取随机索引（索引默认从0开始）
            int animalNumber = r.nextInt(a.length) + 1;
            System.out.println(animalNumber);
            path = "image/animal/animal" + animalNumber + "/";
            step = 0;
            initData();
            initImage();

        } else if (obj == sport) {
            System.out.println("随机选择运动的图片");

            //数组里放文件夹的编号
            int[] s = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
            Random r = new Random();

            //编号：获取随机索引（索引默认从0开始）
            int sportNumber = r.nextInt(s.length) + 1;
            System.out.println(sportNumber);
            path = "image/sport/sport" + sportNumber + "/";
            step = 0;
            initData();
            initImage();
        } else if (obj == friend) {
            System.out.println("随机选择赞助商的图片");

            //数组里放文件夹的编号
            int[] s = {1, 2};
            Random r = new Random();

            //编号：获取随机索引（索引默认从0开始）
            int fNumber = r.nextInt(s.length) + 1;
            System.out.println(fNumber);
            path = "image/friend/friend" + fNumber + "/";
            step = 0;
            initData();
            initImage();
        }
    }

    @Override  //按下时触发显示完整的图片
    public void keyPressed(KeyEvent e) {
        //code记录按键对应数值  L=76
        int code = e.getKeyCode();
        if (code == 76) {
            //把内容全部清空
            this.getContentPane().removeAll();
            //新建一个完整的图片
            JLabel all = new JLabel(new ImageIcon(path+"all.jpg"));
            all.setBounds(80, 130, 400, 400);
            //添加到页面中
            this.getContentPane().add(all);
            //刷新页面
            this.getContentPane().repaint();
        }
    }
}
